package genericity

import "fmt"

type CusNumT interface {
	// 表示支持这些类型， ~ 表示支持int64类型和它的衍生类型
	// | 表示取并集   换行表示取交集
	// 如下含义： int32 | float64 | ~int64 这3中类型可以使用，uint8和uint16不能使用了
	uint8 | int32 | float64 | ~int64
	int32 | float64 | ~int64 | uint16
}

// 定义int64的衍生类型
type myInt64 int64

// 定义int32的别名
type myInt32 = int32

// 使用泛型时候可以使用自定义类型
func getMaxCusNum[T CusNumT](a, b T) T {
	fmt.Println(a)
	fmt.Println(b)
	return a
}

// 调用自定义泛型的函数
func Test2() {
	getMaxCusNum[int64](1, 2)
	// 也可以指定不同类型了, 包括自定义的衍生类型
	var a myInt64 = 1
	//var b myInt32 = 2	// int32的衍生类型不在CusNumT的定义中，所以不可以作为传入参数
	//getMaxCusNum[myInt64, myInt32](a, b)
	// 这里定义的入参类型要和填入的参数一样，但如果传入uint8或者uint16就报错了
	var b int32 = 2
	getMaxCusNum[myInt64](a, myInt64(b)) // 参数的类型CusNumT包含的类型都可以传入，但是只能指定其中一种类型使用
}
